最近在使用 Rails 做專案時,時常寫到長這樣的程式碼:
class CommentsController < ApplicationController
before_action :find_article, only: [:create]
def find_article
@article = Article.find(params[:article_id])
end
==========
class BlogVisitor < ApplicationRecord
belongs_to :user
belongs_to :blog
end
def user_params
params.require(:user).permit(:email, :password, :password_confirmation)
end
起初會以為是不是冒號加錯地方,但是改成before_action: find_article
程式直接 Boom!!! 直接壞給你看。
所以:find_article
、:user
、:email
是什麼呢?
這個符號大家應該都知道是什麼吧!
沒錯!就是大名鼎鼎的蘋果公司,但是誰告訴你這就是蘋果公司了。
他就只是一個符號,代表著蘋果公司。
以此類推:
你看到一隻狗,你會說牠是一隻狗,看到一隻貓會說牠是一隻貓。
但動物呢?牠是什麼?
因為不能明確的指出動物是什麼,我們只能說動物就是一種所有類別的集合。
看到這邊,你一定會想問:講這麼多,所以符號到底是什麼東西啦!
簡單來說,它只不過是"帶有名字的物件"。
還記得 Ruby 是物件導向的程式語言嗎?
所以1
是一個數字物件、"a"
是一個字串物件、:hello
一個符號物件。
p :hello.class # => Symbol 名叫hello的物件
p 2.class # => Integer 名叫2的物件
所以符號就只是一個帶有名字的物件。
這兩者有什麼差別呢?
首先,變數是一個指向某個物件的名字。
character = "Mario"
上面的語法經過翻譯蒟蒻,是指character
變數指向Mario
這個字串物件。如果我將Mario
拿掉,那character
變數就沒辨法存活下來了,因為沒有東西可以讓他指了,它就變得一點用都沒有。
而Symbol本身就是一個帶有名字的物件,所以不用指向任何東西就可以使用了。
如果你把Symbol當作變數在用,那麼它就會噴你滿臉灰。
:state = "Error!" # => syntax error
你可以這樣寫:
character = :character
這樣的概念就像是 a = 1
。
當某天有人跟你說,符號跟變數的是一樣的?
你可以回答他:符號不是變數,它就只是一個值或者是一個物件。
這兩個的差異在於字串的內容是可以變,但Symbol不行。
先以字串來說:
greeting = "How are you"
greeting[0] = "W"
p greeting # => "Wow are you"
我可以很輕鬆的改掉字串中的字。
那換成Symbol呢?
greeting = :Hello
greeting[0] = "W"
p greeting # => NoMethodError
會出現錯誤訊息是因為,Symbol沒有 []= 這個方法
其他像是length
、upcase
、downcase
等,這些跟字串長很像的方法都可以使用。
p :kitty.length # => 5
p :kitty.upcase # => :KITTY
甚至你可以取得字元
p :kitty[4] # => "y"
這邊要再次提醒各位,字串可以被修改,但Symbol不能被修改。
這裡幫大家重點整理一下
Symbol | Srting | |
---|---|---|
可變 | No | Yes |
修改 | No | Yes |
取得字元 | Yes | Yes |
下個單元將會介紹關於一些Symbol小秘密以及使用的時機。
參考文章:
1.為你自己學 Ruby on Rails